Java 中的字节码是一组高度优化的 Java 虚拟机 (JVM) 指令,用于读取和解释以运行 Java 程序。 字节码是只能在 JVM 上运行的二进制程序代码。 它由Java解释器并生成可以直接在真机的指令。 Java字节码的特征 Java 字节码有两个最重要的特征,如下所示: 字节码独立于处理器,即Java程序可以在任何处理器架构上执行。 字节码在Java中是如何工作的? 当我们编写Java程序时,源代码(以.java文件的形式)由Java编译器编译并以.class文件的形式转换为字节码。 看看下2张图就能更好地理解它了。 .java和.class的区别 Java 源代码文件(扩展名为.java)被编译为字节码(具有.class扩展名),然后由名为 JVM 的 Java 处理器解释和执行。 关键点: 1. Java 中的字节码是 Java 编译器生成并由 Java 解释器 (JVM) 执行的一组字节长的指令。 2.
我们自然会使用 Java 客户端与 RabbitMQ 服务器进行交互;此客户端的Maven 依赖项为: <dependency> <groupId>com.rabbitmq</groupId> amqp-client</artifactId> <version>4.0.0</version> </dependency>Copy 使用官方指南运行 RabbitMQ 代理后,我们需要使用 java
在本教程中,我们将仔细研究如何最好地使用它。 2. 为什么我们需要AtomicStampedReference?
为了解决这个问题,Java 11引入了Z垃圾收集器(ZGC)作为实验性垃圾收集器(GC)实现。 在本教程中,我们将看到ZGC 如何设法在数 TB 的堆上保持较短的暂停时间。 2. 垃圾回收 当我们创建一个 Java 应用程序时,我们不必释放我们分配的内存,因为垃圾收集器会为我们完成这项工作。总之,GC 通过引用链监视我们可以从应用程序中访问哪些对象,并释放我们无法访问的对象。
栈类是在Java 1.0版本中引入的。它存在于java.util.Stack<E>包中。 这个类现在被认为是 Java 中的遗留类,因为它与 Java Collections Framework 不一致。因此建议大家使用新的Java ArrayDeque 类。 Java Stack 类的层次结构 Java Stack 类扩展了扩展 AbstractList 类的向量类。它实现了列表接口和随机访问接口。栈类还实现了可序列化和可克隆接口。 java 中栈的层次结构图如下图所示。 栈类的功能 Java 中的栈有几个特性,如下所示: 1. 栈具有“后进先出”检索的元素的能力。 2. 在 Java 栈中,所有操作都发生在栈的顶部。 3. 推送操作将元素插入栈顶部。 4.
Maven 依赖 首先,我们需要将 Maven 依赖项添加到 flink-java 和flink-test-utils库中: <dependency> <groupId>org.apache.flink </groupId> <artifactId>flink-java</artifactId> <version>1.2.0</version> </dependency> <dependency
在本教程中,我们将看看 Java 如何使用ProcessBuilderAPI 缓解这种情况。 2.进程生成器接口 类提供了用于创建和配置操作系统进程的方法。 使用ProcessBuilder打印 Java 版本 在第一个示例中,我们将使用一个参数运行java命令以获取版本。 让我们回到原始示例来打印出 Java 版本。 结论 总而言之,在本教程中,我们详细探讨了java.lang.ProcessBuilderAPI。 首先,我们首先解释了 API 可以做什么,并总结了最重要的方法。 接下来,我们看了一些实际的例子。 最后,我们研究了 Java 9 中 API 中引入了哪些新增功能。
简介 在本教程中,我们将深入了解进程API。 它所指的进程是一个正在执行的应用程序。Process类提供与这些进程交互的方法,包括提取输出、执行输入、监视生命周期、检查退出状态以及销毁(终止)它。 \\com\\java9\\process\\OutputStreamExample.java"); process = Runtime.getRuntime() .exec("java -cp src/main/java com.baeldung.java9.process.OutputStreamExample"); BufferedReader output = new 代码中执行Java代码的应用几乎是无限的。 \\com\\java9\\process\\OutputStreamExample.java"); process = Runtime.getRuntime() .exec("java
简介 Java 9为开发人员带来了许多新的有用功能。 其中之一是java.lang.invoke.VarHandleAPI - 表示变量句柄 - 我们将在本文中探讨。 2. 什么是可变手柄? VarHandle的目标是定义一个标准,用于调用字段和数组元素上的 java.util.concurrent.atomic和sun.misc.Unsafe操作的等效项。 例如,以下是Java本身如何在内部使用VarHandles来实现AtomicReference: private volatile V value; private static final VarHandle 在Java 9之前,此操作的等效API是Unsafe类和来自ReflectionAPI的setAccessible()方法。 但是,这种方法有其缺点。例如,它仅适用于变量的特定实例。
Java 中TreeMap的内部工作原理 现在,我们将讨论一个示例,看看TreeMap在内部是如何工作的。 /** * */ package com.jack.map; import java.util.Map; import java.util.TreeMap; /** * @author Jack.Yang
分支预测是计算机科学中一个有趣的概念,可以对我们应用程序的性能产生深远的影响。然而,它通常没有得到很好的理解,大多数开发人员很少关注它。
简介 在本教程中,我们将了解梯度下降算法。我们将在 Java 中实现该算法并逐步说明它。 2. 什么是梯度下降? 梯度下降是一种优化算法,用于查找给定函数的局部最小值。 我们将在本教程中说明和实现回溯梯度下降。 4. 分步说明 梯度下降需要一个函数和一个起点作为输入。让我们定义并绘制一个函数: 我们可以从任何想要的点开始。 在 Java 中的实现 有几种方法可以实现梯度下降。在这里,我们不计算函数的导数来找到斜率的方向,因此我们的实现也适用于不可微函数。
简介 Java 9对CompletableFuture类进行了一些更改。 结论 总之,Java 9 对CompletableFutureAPI 进行了一些补充,它现在对子类化有了更好的支持,这要归功于新的 IncompleteFuture虚拟构造函数,可以控制大多数 CompletionStage
概述 在本教程中,我们将研究java.lang包中的ThreadLocal构造。这使我们能够单独存储当前线程的数据,并简单地将其包装在特殊类型的对象中。 这是在 Java 中实现线程安全的合理方法。但是,当我们一起使用ThreadLocal和线程池时,我们应该格外小心。
概述 本教程介绍了 Java 中的线程池。我们将从标准Java库中的不同实现开始,然后查看Google的Guava库。 2. 线程池 在 Java 中,线程映射到系统级线程,这些线程是操作系统的资源。 我们使用Executor和ExecutorService接口来处理Java中的不同线程池实现。通常,我们应该使代码与线程池的实际实现分离,并在整个应用程序中使用这些接口。 这两者都是函数接口,我们可以将它们作为 lambda 传递(从 Java 8 开始)。 Runnable 的单一方法不会引发异常,也不会返回值。 有关使用 ExecutorService 接口和Future接口的更多示例,请查看ExecutorService使用指南-Java快速入门教程 。 这个框架在我们的fork-join使用框架指南-Java快速入门教程 中有详尽的描述。 让我们看一个简单的示例,该示例使用ForkJoinPool遍历节点树并计算所有叶值的总和。
sync关键字确保一次只有一个线程可以进入该方法(要了解有关锁定和同步的更多信息,请参阅 –Java 中的同步关键字指南): public class SafeCounterWithLock { Java中的原子变量 Java 中最常用的原子变量类是 AtomicInteger、AtomicLong、AtomicBoolean和AtomicReference。 从Java 9开始,这个方法在所有原子实现中都已弃用,取而代之的是weakCompareAndSetPlain()。
在本教程中,我们将在 Java 示例的帮助下研究两个这样的问题,死锁和活锁。 2. 死锁 2.1. 什么是死锁? 当两个或多个线程永远等待另一个线程持有的锁或资源时,就会发生死锁。 死锁示例 首先,让我们看一个简单的 Java 示例来理解死锁。 在此示例中,我们将创建两个线程,T1和T2。线程T1调用操作1,线程T2调用操作。 避免死锁 死锁是 Java 中常见的并发问题。因此,我们应该设计一个 Java 应用程序来避免任何潜在的死锁情况。 首先,我们应该避免为一个线程获取多个锁的需要。
概述 在本教程中,我们将学习是什么使对象不可变,如何在 Java 中实现不可变性,以及这样做有什么好处。 2. 什么是不可变对象? 不可变对象是其内部状态在完全创建后保持不变的对象。 Java中的final 关键字 在尝试在 Java 中实现不变性之前,我们应该讨论final关键字。 在 Java 中,变量默认是可变的,这意味着我们可以更改它们保存的值。 通过在声明变量时使用final关键字,Java 编译器不允许我们更改该变量的值。 Java中的不可变性 现在我们知道了如何避免更改变量的内容,我们可以使用它来构建不可变对象的 API。 构建不可变对象的 API 需要我们保证无论我们如何使用其 API 都不会更改其内部状态。 Money { private final double amount; private final Currency currency; // ... }Copy 请注意,Java
Java编译器和解释器是程序员在编程过程中使用的Java语言中最基本的工具。 Java 中的编译器是用于编译 Java 程序的计算机程序。它是独立于平台的。 它将源代码(.java文件)转换(转换)为字节码(.class文件)。 换句话说,编译器(javac.exe)在编译过程中生成字节码。 完整 Java 编译器选项的屏幕截图如下所示: 编译器的主要职责 除了编译源程序外,Java 编译器还负责以下任务: a)Java编译器检查句法错误(语法错误)。 当它在程序中发现错误时,它还生成一个包含所有错误消息的列表,并且不生成目标代码,除非Java编译器报告的错误得到纠正。 b)它在Java虚拟机(JVM)的帮助下将源代码转换为字节码。 Java 编译器如何工作? 我们可以在上图中看到,程序员编写的Java源代码由javac编译,然后生成java字节码(.class文件),该字节码以文件(扩展名.class)自动保存在磁盘上。
简介 在本教程中,我们将看到 Java 中一些最常见的并发问题。我们还将学习如何避免它们及其主要原因。 2. 使用线程安全对象 2.1. 共享对象 线程主要通过共享对相同对象的访问来进行通信。 出于这个原因,Java提供了并发集合,如CopyOnWriteArrayList和ConcurrentHashMap,可以由多个线程同时访问: CopyOnWriteArrayList<String>